<?php
/*
 * * * * * * * * * * LICENCIA * * * * * * * * * * * * * * * * * * * * *

Copyright(C) 2012
Instituto Universtiario de Tecnología Dr. Federico Rivero Palacio

Este programa es Software Libre y usted puede redistribuirlo y/o modificarlo
bajo los términos de la versión 3.0 de la Licencia Pública General (GPLv3)
publicada por la Free Software Foundation (FSF), es distribuido sin ninguna
garantía. Usted debe haber recibido una copia de la GPLv3 junto con este
programa, sino, puede encontrarlo en la página web de la FSF, 
específicamente en la dirección http://www.gnu.org/licenses/gpl-3.0.html

 * * * * * * * * * * ARCHIVO * * * * * * * * * * * * * * * * * * * * *

Nombre: PensumServicio.clase.php
Diseñador: Miguel Terrami (metsterrami@gmail.com)
Programador: Miguel Terrami
Fecha: Agosto de 2012
Descripción: 

	Esta clase ofrece el servicio de conexión a la base de datos, recibe 
	los parámetros, construye las consultas SQL, hace las peticiones a 
	la base de datos y retorna los objetos o datos correspondientes a la
	acción.

 * * * * * * * * Cambios/Mejoras/Correcciones/Revisiones * * * * * * * *
Diseñador - Programador /   Fecha   / Descripción del cambio
---                         ----      ---------

 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
require_once "TrayectoServicio.clase.php";

class PensumServicio 
{
	function __construct() 
	{
	}
		
	/*	Método genérico que permite hacer consultas complejas.
		Parámetros de entrada:
	    	campos: campos a consultar de la base de datos (opcional)
	    	where: condición where de la consulta (opcional)
	    	orderby: clausula order by de la consulta SQL (opcional)
	    	parametros: arreglo con los parámetros de la consulta (opcional)
		Valores de retorno:
			un arreglo de objetos tipo Pensum.
	    	null: no trae ningun pensum.
		Excepciones que lanza.
			Exception: si ocurre un error en la base de datos.
	*/
	static function obtenerPensum($campos="*", $where=null, $orderBy=null, $parametros=null)
	{
		//instrucción para reconocer el objeto conexión
		global $gbConectorBD;
		//construcción de la consulta SQL
		$sql = "select $campos from ts_pensum"
			. (($where!=null)? " where $where":"")
			. (($orderBy!=null)? " order by $orderBy":"")
			. ";";
		
		$result = $gbConectorBD->ejecutarDQLDirecto($sql,$parametros);
		if ($result === FALSE) 
			throw new Exception("Fallo la conexion a base de datos");
		if ( $result === 0) 
			return null;
			
			for ($i = 0 ; $i < count($result); $i++){
				//retorna un arreglo de Pensum en caso de existir data
				$pensums[$i] = new Pensum();
				$pensums[$i]->asignarCodigo($result[$i]['codigo']);
				$pensums[$i]->asignarNombre($result[$i]['nombre']);
				$pensums[$i]->asignarNombreCorto($result[$i]['nom_corto']);
				$pensums[$i]->asignarObservaciones($result[$i]['observaciones']);
			}

			return $pensums;
		
	}			

	/*	Metodo que  permite buscar un pensum en específico por su codigo, 
		si el parámetro completo se pasa con true trae un pensum con sus 
		trayectos y unidades curriculares, si pasa en false trae el objeto
		pensum con su información básica sin trayectos ni unidades, el parámetro
		completo esta en true predeterminado.
		
		Parámetros de entrada:
			codigo: código del pensum a buscar.
			Completo: valor booleano que definirá como se obtendrá el pensum. 
		Valores de retorno:
			objeto pensum .
			Null : de no existir coincidencia.
	    Excepciones que lanza.
			Exception: si ocurre un error en la base de datos.
			Exception: si el codigo es null.
	*/
	static function obtenerPensumPorCodigo($codigo,$completo=TRUE){
		if ($codigo===null)
			throw new Exception("El parametro codigo pasado a la funcion obtenerPensumPorCodigo() estan en null");
		$pensums=PensumServicio::obtenerPensum("*", "codigo = $1",null, array($codigo));
		if ($pensums!= null)
			$pensum =$pensums[0];
		else
			return null;
		if ($completo==TRUE){
			$trayectos=TrayectoServicio::obtenerTrayectoPorPensum($codigo);
			if ($trayectos!= null)
				$pensum->asignarTrayectos($trayectos);
			else
				return $pensum;
		}
		else
			return $pensum;
		return $pensum;
	}
	
	
	
	
	/*	Permite buscar un pensum en específico por su nombre corto, si el
		parámetro completo se pasa con true trae un pensum con sus trayectos 
		y unidades curriculares, si pasa en false trae el objeto pensum con 
		su información básica sin trayectos ni unidades, el parámetro completo
		esta en true predeterminado.
		
		Parámetros de entrada:
			nombreCorto: nombre corto del pensum a busca.
			Completo: valor booleano que definirá como se obtendrá el pensum.
		Valores de retorno:
			objeto pensum .
			Null : de no existir coincidencia.
		Excepciones que lanza.
			Exception: si ocurre un error en la base de datos.
			Exception: si el nomCorto es null.
	*/
	static function obtenerPensumPorNombreCorto($nombreCorto,$completo=TRUE){
		if ($nombreCorto===null)
			throw new Exception("El parametro nombreCorto pasado a la funcion obtenerPensumPorNombreCorto() estan en null");
		$codigo=PensumServicio::obtenerCodigo($nombreCorto);
		if ($codigo !=null)
				return PensumServicio::obtenerPensumPorCodigo($codigo,$completo);
		else
			return null;
	}

	/*	Permite buscar varios pensum según un patrón de búsqueda, buscará
		cualquier coincidencia en mayúscula y/o minúscula en cualquier parte
		del nombre, nombre corto y observaciones.
		Parámetros de entrada:
			patron: patrón a buscar en los diferentes campos.
		Valores de retorno:
			Un arreglo de objetos tipo pensum.
			null: valor numérico 0 en caso de no existir coincidencias.
		Excepciones que lanza.
			Exception: si ocurre un error en la base de datos.
	*/
	static function obtenerListaPensum($patron){
		$patron = "%" . $patron . "%";
		$where = "upper(nombre) like upper($1) or 
		          upper(nom_corto) like upper($1) ";
		return PensumServicio::obtenerPensum("*", $where, "codigo asc",array($patron));	
	}
	
	/*	Permite buscar el nombre corto de un pensum según un codigo.
		Parámetros de entrada:
	    	codigo: codigo del pensum.
		Valores de retorno:
			el nombre corto del pensum.
			null: valor numérico 0 en caso de no existir coincidencias.
		Excepciones que lanza.
			Exception: si el codigo pasado por parametro es null.
	*/
	
	static function obtenerNombreCorto($codigo){
		if ($codigo===null)
			throw new Exception("El parametro codigo pasado a la funcion obtenerNombreCorto() estan en null");
		$pensums=PensumServicio::obtenerPensum("*", "codigo = $1",null, array($codigo));
		if ($pensums!= null){
			$pensum =$pensums[0];
			return $pensum->obtenerNombreCorto();
		}
		else 
			return null;
	}
	
	/*	Permite buscar el codigo de un pensum según un nombre corto.
		Parámetros de entrada:
	    	nomCorto: Nombre corto del pensum.
		Valores de retorno:
			el codigo del pensum.
			null: valor numérico 0 en caso de no existir coincidencias.
		Excepciones que lanza.
			Exception: si el nomCorto pasado por parametro es null.
	*/
	
	static function obtenerCodigo($nombreCorto){
		if ($nombreCorto===null)
			throw new Exception("El parametro nombreCorto pasado a la funcion obtenerCodigo() estan en null");
		$pensums=PensumServicio::obtenerPensum("*", "upper(nom_corto) = upper($1)",null, array($nombreCorto));
		if ($pensums!= null){
			$pensum =$pensums[0];
			return $pensum->obtenerCodigo();
		}
		else 
			return null;
	}
	
	/*	Permite agregar un pensum a la base de datos.
		Parámetros de entrada:
	     	pensum: objeto tipo Pensum.
		Valor de retorno:
	    	codigo del pensum: en caso de éxito.
	    	False: en caso de error.
		Excepciones que lanza.
			Exception: si el pensum pasado por parametro es null.
			Exception: si ocurre un error en la base de datos.
	*/
	static function agregarPensum($pensum){
		global $gbConectorBD;
		
		if ($pensum === null) 
			throw new Exception("El objeto pensum pasado por parametro en la funcion agregarPensum() es null");
		
		//buscar el primer código libre
		$sql = "select coalesce(max(codigo), 10) + 1 as codigo from ts_pensum;";
		$result = $gbConectorBD->ejecutarDQLDirecto($sql,array());
		
		
		if ( $result === false) 
			throw new Exception("Fallo la conexion a base de datos en la búsqueda del código");
			
		$codigo = $result[0][0];
		
		$sql = "insert into ts_pensum (codigo,nombre,nom_corto,observaciones) 
				values (  $codigo, $1,  trim(upper($2)),  $3);";
		$parametros = array($pensum->obtenerNombre(),
							$pensum->obtenerNombreCorto(),
							$pensum->obtenerObservaciones()
						);
		$result = $gbConectorBD->ejecutarDMLDirecto($sql,$parametros);
		
		
		if ($result === FALSE) 
			throw new Exception("Fallo la conexion a base de datos");
		if ( $result === 0) 
			return false;
			
		return $codigo; //PensumServicio::obtenerCodigo($pensum->obtenerNombreCorto());
		
	}
	static function agregarPensumRESPALDO($pensum){
		global $gbConectorBD;
		
		if ($pensum === null) 
			throw new Exception("El objeto pensum pasado por parametro en la funcion agregarPensum() es null");
		
		
		$sql = "insert into ts_pensum (codigo,nombre,nom_corto,observaciones) 
				values (  (select coalesce(max(codigo), 10) + 1 from ts_pensum),
				     $1,  trim(upper($2)),  $3);";
				     
		$parametros = array($pensum->obtenerNombre(),
							$pensum->obtenerNombreCorto(),
							$pensum->obtenerObservaciones()
						);
	
		$result = $gbConectorBD->ejecutarDMLDirecto($sql,$parametros);
		
		if ($result === FALSE) 
			throw new Exception("Fallo la conexion a base de datos");
		if ( $result === 0) 
			return false;
			
		return PensumServicio::obtenerCodigo($pensum->obtenerNombreCorto());
		
	}
	/*	Permite agregar un pensum a la base de datos.
		Parámetros de entrada:
	     	nombre: nombre del pensum.
			NombreCorto: Nombre corto del pensum.
			Observaciones: observaciones del pensum.
		Valor de retorno:
			codigo del pensum: en caso de éxito.
			False: en caso de error.
		Excepciones que lanza.
			Exception: si el nombre corto pasado por parametro es null.
			Exception: si ocurre un error en la base de datos.
	*/
	static function agregarPensumD($nombre,$nombreCorto,$observaciones){
		global $gbConectorBD;
	
		if ($nombreCorto === null)
			throw new Exception("Alguno de los parametros pasados a la funcion agregarPensump() estan en null verifique el nombreCorto");
			
		$pensum = new Pensum();
		$pensum->asignarNombre($nombre);
		$pensum->asignarNombreCorto($nombreCorto);
		$pensum->asignarObservaciones($observaciones);
		
		return PensumServicio::agregarPensum($pensum);
		
	}
	
	
	
	/*	Permite modificar un pensum en la base de datos.
		Parámetros de entrada:
			pensum: objeto tipo Pensum, la modificación se le hará
	        al pensum que tenga el mismo código de este objeto.
		Valor de retorno:
	     	True: en caso de éxito.
	     	False: en caso de error.
		Excepciones que lanza.
			Exception: si el pensum pasado por parametro es null.
			Exception: si ocurre un error en la base de datos.
	*/	
	static function modificarPensum($pensum){
		global $gbConectorBD;
		if ($pensum === null) 
			throw new Exception("El objeto pensum pasado por parametro en la funcion modificarPensum() es null");
			
		$sql = "update ts_pensum set nombre = $2, nom_corto = trim(upper($3)), observaciones = $4
		         where codigo = $1;";

		$parametros = array($pensum->obtenerCodigo(),
							$pensum->obtenerNombre(),
							$pensum->obtenerNombreCorto(),
							$pensum->obtenerobservaciones()
						);
		$result = $gbConectorBD->ejecutarDMLDirecto($sql,$parametros);

		if ($result === FALSE) 
			throw new Exception("Fallo la conexion a base de datos");
		if ( $result === 0) 
			return false;
		return true;
	}
	
	/*	Permite modificar un pensum en la base de datos.
		Parámetros de entrada:
			codigo: codigo del pensum el cual se modificara.
			Nombre: Nuevo nombre del pensum.
	        NombreCorto: Nuevo nombre corto del pensum.
			Observaciones: Nuevas observaciones del pensum.
		Valor de retorno:
	     	True: en caso de éxito.
	     	False: en caso de error.
		Excepciones que lanza.
			Exception: si el codigo o nombre corto pasado por parametro es null.
			Exception: si ocurre un error en la base de datos.
	*/
	static function modificarPensumD($codigo,$nombre,$nombreCorto,$observaciones){
		global $gbConectorBD;
		if (($codigo === null) or ($nombreCorto === null))
			throw new Exception("Alguno de los parametros pasados a la funcion modificarPensump() estan en null verifique codigo o nombreCorto..");
		
		$pensum = new Pensum();
		$pensum->asignarCodigo($codigo);
		$pensum->asignarNombre($nombre);
		$pensum->asignarNombreCorto($nombreCorto);
		$pensum->asignarObservaciones($observaciones);
		
		return PensumServicio::modificarPensum($pensum);
		
	}
	
	
	
	/*	Permite eliminar un pensum de la base de datos por el codigo.
		Parámetros de entrada:
			codigo: código del pensum a eliminar.
		Valor de retorno:
	    	True: en caso de éxito
			False: en caso de error
		Excepciones que lanza.
			Exception: si el codigo  pasado por parametro es null.
			Exception: si ocurre un error en la base de datos.
	*/	
	static function eliminarPensum($codigo){
		global $gbConectorBD;
		if ($codigo === null)
			throw new Exception("El codigo pasado a la funcion eliminarPensum() esta en null");
		
		$sql = "delete from ts_pensum 
		         where codigo = $1;";
		$parametros = array($codigo);
		
		//conexión, ejecución y desconexión
		$result = $gbConectorBD->ejecutarDMLDirecto($sql,$parametros);

		if ($result === FALSE) 
			throw new Exception("Fallo la conexion a base de datos");
		if ( $result === 0) 
			return false;
		return true;
	}
	
	/*	Permite eliminar un pensum de la base de datos por el nombre corto.
		Parámetros de entrada:
			nomCorto: nombre Corto del pensum a eliminar.
		Valor de retorno:
	    	True: en caso de éxito
			False: en caso de error
		Excepciones que lanza.
			Exception: si el nomCorto  pasado por parametro es null.
			Exception: si ocurre un error en la base de datos.
	*/
	static function eliminarPensumPorNombreCorto($nom_corto){
		global $gbConectorBD;
		if ($nom_corto === null)
			throw new Exception("El nom_corto o el numero pasado a la funcion eliminarPensum1() esta en null");
		return PensumServicio::eliminarPensum(PensumServicio::obtenerCodigo($nom_corto));
		
	}
}
